﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using log4net;
using log4net.Config;
using System.Runtime.InteropServices;
using System.Timers;


namespace LectorHuellaC
{

    public partial class RelojChecador : Form, DPFP.Capture.EventHandler 
    {
        
          //System.Timers.Timer aTimer = new System.Timers.Timer();

        string IdEmpresa = Settings1.Default.IdEmpresa.ToString();
        string IdSucursal = Settings1.Default.IdSucursal;      

        log4net.ILog logger;
        String versionapp = "A 1.0";
        string statusConection = "";
        public void tipoConexion(String conection)
        {
            statusConection = conection;
            label1.Text = statusConection;
            this.Text = ":: Reloj Checador :: " + versionapp + " (" + this.Text + ")";
        }

        public RelojChecador()
        {
            log4net.Config.XmlConfigurator.Configure();
            logger = log4net.LogManager.GetLogger(typeof(Program));
            InitializeComponent();
            this.Text = ":: Reloj Checador :: " + versionapp + " (" + this.Text + ")";
            //aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            //aTimer.Interval = 500;
            //aTimer.Enabled = true;
        }

        private DPFP.Sample ImagenSample;
        private DPFP.Template ImagenTemplate;
        private DPFP.Template Template;
        private DPFP.Verification.Verification Verificator;
        private DPFP.Processing.Enrollment Enroller;
        private DPFP.Capture.Capture Capturer;

        public string OpcionAcceso = "";
       static  public string MensajeLabel = ""; 

        private void timer1_Tick(object sender, EventArgs e)
        {
            lblFecha.Text = System.DateTime.Now.ToLongDateString().ToUpperInvariant();
            lblHora.Text = System.DateTime.Now.ToLongTimeString().ToString().Trim();
        }

        private void RelojChecador_Load(object sender, EventArgs e)
        {
            try
            {
                bool respuesta = ConsultaConfiguracion();
                if (respuesta == false)
                {
                    MessageBox.Show("Error en la consulta de opción de acceso", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                if (OpcionAcceso == "CAP")
                {
                    txtCapturaCodbar.Visible = false;
                    txtCapturaEmpleado.Visible = true;
                    lblNotificacion.Text = "Ingrese el codigo de registro ";
                    lblNotificacion.Visible = true;
                    groupBox4.Visible = true;
                    //MessageBox.Show(OpcionAcceso);
                }

                if (OpcionAcceso == "HUE")
                {
                    txtCapturaCodbar.Visible = false;
                    txtCapturaEmpleado.Visible = false;
                    lblNotificacion.Text = "Por favor coloque su huella";
                    lblNotificacion.Visible = true;
                    groupBox4.Visible = true;
                    lblMensaje.Text = MensajeLabel;
                    // Inicializar el Lector 
                    Init();
                    Start();
                }

                if (OpcionAcceso == "TAR")
                {
                    txtCapturaCodbar.Visible = true;
                    txtCapturaEmpleado.Visible = false;
                    lblNotificacion.Text = "Ingrese el codigo de barras";
                    lblNotificacion.Visible = true;
                    groupBox4.Visible = true;
                    //MessageBox.Show(OpcionAcceso);
                }


                // Timer
                lblFecha.Text = System.DateTime.Now.ToLongDateString().ToUpperInvariant();
                lblHora.Text = System.DateTime.Now.ToLongTimeString().ToString();
                timer1.Interval = 1000;
                timer1.Start();

                timer2.Interval = 10000; //Para borrar el nombre despues de 9 segundos
                timer2.Start();

                timer3.Interval = 500; // Para mostrar los mensajes de notificacion cuando es por huella digital
                timer3.Start();

                lblMensaje.Text = "";
                Control.CheckForIllegalCrossThreadCalls = false; //alvarmat
            }
            catch (Exception ex)
            {
                logger.Error("Error" + ex);

            }
        }

        private bool ConsultaConfiguracion()
        {
            string IdEmpresa = Settings1.Default.IdEmpresa.ToString();
            string IdSucursal = Settings1.Default.IdSucursal;
            string ConsultaBD = "Select OpcionAcceso from reloj_opcionesacceso where IdEmpresa = " + IdEmpresa + " And IdSucursal = '" + IdSucursal + "' ";
            ConectaBD conBD = new ConectaBD();
            DataSet ds = new DataSet();
            ds = conBD.Consulta(ConsultaBD);
            if (ds.Tables.Count == 0)
            {
               /// MessageBox.Show("Error en la consulta de Opciones de Acceso (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
            if (ds.Tables["Resultado"].Rows.Count == 0)
            {
                return false;
            }
            else
            {
                OpcionAcceso = ds.Tables["Resultado"].Rows[0]["OpcionAcceso"].ToString();
                return true;
            }
        }

 
        private bool EsSoloNumeros(string s)
        {
           bool resultado = true;
           int contador=0;
           while (resultado && contador<s.Length) 
           {
              resultado=resultado && (s[contador]>='0' &&  s[contador] <= '9');
              contador++;
           }
           return resultado;
        }
         
    
        

        private void lblNotificacion_Click(object sender, EventArgs e)
        {

        }

        private void groupBox4_Enter(object sender, EventArgs e)
        {

        }


        private int SegundoInicial = 0;
        private void txtCapturaCodbar_KeyPress(object sender, KeyPressEventArgs e)
        {            
            short keyascii = Convert.ToInt16(e.KeyChar);
            try
            {
                if (keyascii == 13)
                {
                    if (OpcionAcceso == "TAR") // Si la Opcion de acceso es por codigo de barras
                    {
                        if (txtCapturaCodbar.Text.Trim() == "")
                        {
                            lblMensaje.Text = "Ingrese el codigo de barras";
                            SegundoInicial = 0;
                            return;
                        }

                        int SegundoFinal = DateTime.Now.Second;
                        int diferencia = Math.Abs(SegundoFinal - SegundoInicial);

                        ///lblMensaje.Text = "Segundo final: " + SegundoFinal.ToString() + " <<< Segundo Inicial: " + SegundoInicial.ToString() + " <<<< Diferencia: " + Math.Abs(SegundoFinal - SegundoInicial);

                        if (diferencia > 2 & diferencia < 58)
                        {
                            //MessageBox.Show("Debe pasar el codigo de barras por el escaner", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            lblMensaje.Text = "Debe pasar el codigo de barras por el escaner";
                            txtCapturaCodbar.Text = "";
                            SegundoInicial = 0;
                            return;
                        }
                        //MensajeLabel = "Espere un momento por favor.....";
                        string IdEmpleado = "";
                        string IdEmpresa = Settings1.Default.IdEmpresa.ToString();
                        string IdSucursal = Settings1.Default.IdSucursal;
                        string Codbar = txtCapturaCodbar.Text.Trim();
                        string ConsultaBD = "Select Nombre, IdEmpleado from reloj_empleados where IdEmpresa = " + IdEmpresa + " And claveentrada = '" + Codbar + "' ";
                        ConectaBD conBD = new ConectaBD();
                        DataSet ds = new DataSet();
                        //test
                      
                       
                        ds = conBD.Consulta(ConsultaBD);
                        if (ds.Tables.Count == 0)
                        {
                            
                            MessageBox.Show("Error en la consulta de empleados (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            //lblMensaje.Text = "Error en la consulta de empleados (T)";
                            txtCapturaCodbar.Text = "";
                            SegundoInicial = 0;
                            return;
                        }
                        if (ds.Tables["Resultado"].Rows.Count == 0)
                        {
                            MessageBox.Show("Empleado no encontrado", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            //lblMensaje.Text = "Empleado no encontrado";
                            txtCapturaCodbar.Text = "";
                            SegundoInicial = 0;
                            return;
                        }
                        else
                        {
                            IdEmpleado = ds.Tables["Resultado"].Rows[0]["IdEmpleado"].ToString();

                            if (TieneIncidencia(IdEmpresa, IdSucursal, IdEmpleado) == true)
                            {
                                //MessageBox.Show("Registro no permitido, Ya se encuentra una incidencia registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                lblMensaje.Text = "Registro no permitido, Ya se encuentra una incidencia registrada para este empleado.";
                                txtCapturaCodbar.Text = "";
                                return;
                            }

                            string UsoHorario = "";
                            UsoHorario = ObtieneUsoHorario(IdEmpresa, IdSucursal);

                            string TipoRegistro = "";
                            TipoRegistro = ObtieneTipoRegistro(IdEmpresa, IdSucursal, IdEmpleado, UsoHorario);
                            if (TipoRegistro == "YA_EXISTE_SALIDA")
                            {
                                MessageBox.Show("Registro no permitido, existe una salida registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                //lblMensaje.Text = "Registro no permitido, existe una salida registrada para este empleado.";
                                chkSalida.Checked = false;
                                txtCapturaCodbar.Text = "";
                                return;
                            }


                            bool Correcto = false;
                            string sentencia = "";
                            string mensage = "";
                            sentencia = "insert into reloj_registro " 
                                +"(IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro,Fechanow) " 
                                +"values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleado + "','" + TipoRegistro + "', " 
                                +" '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', " 
                                +" date(date_add(now(),interval - " + UsoHorario + " hour)), date_add(now(),interval - " + UsoHorario + " hour) )";
                            //sentencia = "insert into reloj_registro (IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro) values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleado + "','" + TipoRegistro + "', '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', '" + System.DateTime.Now.ToString("yyyyMMdd") + "')";
                            Correcto = conBD.InsertUpdate(sentencia);
                            if (Correcto == true)
                            {
                                string NombreEmpleado = ds.Tables["Resultado"].Rows[0]["Nombre"].ToString();
                                switch (TipoRegistro)
                                {
                                    case "ENTRADA":
                                        mensage = "Entrada Registrada: " + NombreEmpleado;
                                        break;
                                    case "PRESENCIA":
                                        mensage = "Presencia Registrada: " + NombreEmpleado;
                                        break;
                                    case "SALIDA":
                                        mensage = "Salida Registrada: " + NombreEmpleado;
                                        break;
                                    default:
                                        mensage = "Registro Actualizado";
                                        break;
                                }

                                txtCapturaCodbar.Text = "";
                                chkSalida.Checked = false;
                                lblMensaje.Text = "";
                                MessageBox.Show(mensage, "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            }
                            else
                            {
                                //MessageBox.Show("Error al actualizar el registro", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                lblMensaje.Text = "Error al actualizar el registro";
                                txtCapturaCodbar.Text = "";
                                chkSalida.Checked = false;
                            }
                        }

                        SegundoInicial = 0;
                    }
                }//end end end moment
                else
                { 
                    EstableceSegundoInicial();
                }
            }catch(Exception ex){
                logger.Error("error" + ex);
            }
        }

        private void EstableceSegundoInicial()
        {
            //Funcion que establece el segundo inicial para medir la velocidad de captura del codigo de barras
            if (SegundoInicial == 0)
            {
                SegundoInicial = DateTime.Now.Second;
                ///lblMensaje.Text = "Segundo Inicial: " + SegundoInicial.ToString();
            }
        }

        private void txtCapturaCodbar_TextChanged(object sender, EventArgs e)
        {

        }


        private void txtCapturaEmpleado_KeyPress(object sender, KeyPressEventArgs e)
        {
            String mensage;
            short keyascii = Convert.ToInt16(e.KeyChar);
            try
            {
                if (keyascii == 13)
                {
                    if (OpcionAcceso == "CAP") // Si la Opcion de acceso es por Captura manual
                    {
                        if (txtCapturaEmpleado.Text.Trim() == "")
                        {
                            lblMensaje.Text = "Ingrese el codigo de registro";
                            return;
                        }
                        string IdEmpresa = Settings1.Default.IdEmpresa.ToString();
                        string IdSucursal = Settings1.Default.IdSucursal;
                        string codigoentrada = txtCapturaEmpleado.Text.Trim();
                        string IdEmpleadoInterno = "";
                        string ConsultaBD = "Select Nombre, IdEmpleado from reloj_empleados where IdEmpresa = " + IdEmpresa + " And ClaveEntrada = '" + codigoentrada + "' ";
                        ConectaBD conBD = new ConectaBD();
                        DataSet ds = new DataSet();
                        ds = conBD.Consulta(ConsultaBD);
                        if (ds.Tables.Count == 0)
                        {
                            MessageBox.Show("Error en la consulta de empleados (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            //lblMensaje.Text = "Error en la consulta de empleados (T)";
                            txtCapturaEmpleado.Text = "";
                            return;
                        }
                        if (ds.Tables["Resultado"].Rows.Count == 0)
                        {
                            MessageBox.Show("Empleado no encontrado", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            //lblMensaje.Text = "Empleado no encontrado";
                            txtCapturaEmpleado.Text = "";
                            return;
                        }
                        else
                        {
                            IdEmpleadoInterno = ds.Tables["Resultado"].Rows[0]["IdEmpleado"].ToString(); //Asigna el idEmpleado Interno

                            if (TieneIncidencia(IdEmpresa, IdSucursal, IdEmpleadoInterno) == true)
                            {
                                MessageBox.Show("Registro no permitido, Ya se encuentra una incidencia registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                //lblMensaje.Text = "Registro no permitido, Ya se encuentra una incidencia registrada para este empleado.";
                                txtCapturaEmpleado.Text = "";
                                return;
                            }

                            string UsoHorario = "";
                            UsoHorario = ObtieneUsoHorario(IdEmpresa, IdSucursal);


                            string TipoRegistro = "";
                            TipoRegistro = ObtieneTipoRegistro(IdEmpresa, IdSucursal, IdEmpleadoInterno, UsoHorario);
                            if (TipoRegistro == "YA_EXISTE_SALIDA")
                            {
                                MessageBox.Show("Registro no permitido, existe una salida registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                //lblMensaje.Text = "Registro no permitido, existe una salida registrada para este empleado.";
                                chkSalida.Checked = false;
                                txtCapturaEmpleado.Text = "";
                                return;
                            }


                            bool Correcto = false;
                            string sentencia = "";
                            //sentencia = "insert into reloj_registro (IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro) values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleado + "','" + TipoRegistro + "', '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', '" + System.DateTime.Now.ToString("yyyyMMdd")+ "')";
                            sentencia = "insert into reloj_registro " 
                                +"(IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro,Fechanow) " 
                                +" values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleadoInterno + "','" + TipoRegistro + "', " 
                                +" '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', " 
                                +" date(date_add(now(),interval - " + UsoHorario + " hour)), date_add(now(),interval - " + UsoHorario + " hour) )";
                            Correcto = conBD.InsertUpdate(sentencia);
                            if (Correcto == true)
                            {
                                string NombreEmpleado = ds.Tables["Resultado"].Rows[0]["Nombre"].ToString();
                                switch (TipoRegistro)
                                {
                                    case "ENTRADA":
                                        mensage = "Entrada Registrada: " + NombreEmpleado;
                                        break;
                                    case "PRESENCIA":
                                        mensage = "Presencia Registrada: " + NombreEmpleado;
                                        break;
                                    case "SALIDA":
                                        mensage = "Salida Registrada: " + NombreEmpleado;
                                        break;
                                    default:
                                        mensage = "Registro Actualizado";
                                        break;
                                }

                                txtCapturaEmpleado.Text = "";
                                chkSalida.Checked = false;
                                MessageBox.Show(mensage, "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            }
                            else
                            {
                                //MessageBox.Show("Error al actualizar el registro", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                lblMensaje.Text = "Error al actualizar el registro";
                                txtCapturaEmpleado.Text = "";
                                chkSalida.Checked = false;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error("Error"+ex);
            }
        }

        private string ObtieneFecServer(string nUsohorario)
        {
            string FechaActualServer = "";
            string ConsultaBD = "Select now() - interval " + nUsohorario + " hour as FechaActual";
            ConectaBD conBD = new ConectaBD();
            DataSet ds = new DataSet();
            ds = conBD.Consulta(ConsultaBD);

            if (ds.Tables.Count == 0)
            {
                MensajeLabel = "Error al conectar a la base de datos (T )";
                return DateTime.Now.ToString("yyyyMMdd"); // en caso de error devualve fecha actual del equipo
            }
            else
            {
               if (ds.Tables["Resultado"].Rows.Count > 0)
                {                    
                    string Fecha = ds.Tables["Resultado"].Rows[0]["FechaActual"].ToString(); // Devuelve fecha como dd/mm/yyyy hh:mm s
                    string dia = Fecha.Substring(0, 2);
                    string mes = Fecha.Substring(3, 2);
                    string anio = Fecha.Substring(6, 4);
                    FechaActualServer = anio + "-" + mes + "-" + dia;
                    return FechaActualServer; 

                }
                else
                {
                    return DateTime.Now.ToString("yyyyMMdd"); // en caso de error devualve fecha actual del equipo
                }
            }
        }

        private string ObtieneTipoRegistro(string IdEmpresa, string IdSucursal, string IdEmpleado, string iHorario)
        {
          //  string FechaActual = DateTime.Now.ToString("yyyyMMdd");
            string FechaActual = ObtieneFecServer(iHorario);
            //MessageBox.Show(FechaActual, "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            ConectaBD conBD = new ConectaBD();
            string ConsultaSalida = "Select * from reloj_registro where IdEmpresa = " + IdEmpresa + " "
            + " And IdSucursal = '" + IdSucursal + "' And IdEmpleado = '" + IdEmpleado + "' "
            +" And date(Fechanow) ='" + FechaActual + "' And TipoRegistro = 'SALIDA' ";
            DataSet dsSalida = new DataSet();
            dsSalida = conBD.Consulta(ConsultaSalida);
            if (dsSalida.Tables.Count == 0)
            {
                MessageBox.Show("Error en la consulta de registro de salida (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return "";
            }
            if (dsSalida.Tables["Resultado"].Rows.Count > 0)
            {
                return "YA_EXISTE_SALIDA";
            }

            string ConsultaEntrada = "Select * from reloj_registro where IdEmpresa = " + IdEmpresa + " "
            +" And IdSucursal = '" + IdSucursal + "' And " 
            +" IdEmpleado = '" + IdEmpleado + "' And date(Fechanow) = '" + FechaActual + "'  ";
            DataSet ds = new DataSet();
            ds = conBD.Consulta(ConsultaEntrada);
            if (ds.Tables.Count == 0)
            {
                MessageBox.Show("Error en la consulta de registro de entrada (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return "";
            }
            if (ds.Tables["Resultado"].Rows.Count == 0)
            {
                return "ENTRADA";
            }
            else
            {
                if (chkSalida.Checked == true)
                {
                    return "SALIDA";
                }
                else
                {
                    return "PRESENCIA";
                }
            }           
        }



        private bool TieneIncidencia(string IdEmpresa, string IdSucursal, string IdEmpleado)
        {
            string FechaActual = DateTime.Now.ToString("yyyyMMdd");
            string ConsultaBD = "Select TipoIncidencia from reloj_incidencias where IdEmpresa = " + IdEmpresa + " And IdSucursal = '" + IdSucursal + "' And IdEmpleado = '" + IdEmpleado + "' And Fecha = '" + FechaActual + "'  ";
            ConectaBD conBD = new ConectaBD();
            DataSet ds = new DataSet();
            ds = conBD.Consulta(ConsultaBD);
            if (ds.Tables.Count == 0)
            {
                MessageBox.Show("Error en la consulta de Incidencias (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
            if (ds.Tables["Resultado"].Rows.Count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            MensajeLabel = "";
            lblMensaje.Text = "";
        }

        private void chkSalida_CheckedChanged(object sender, EventArgs e)
        {
            if (chkSalida.Checked == true)
            {
                DialogResult Respuesta = MessageBox.Show("Confirme que desea marcar el registro como salida", "Reloj Checador", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (Respuesta == DialogResult.No)
                    chkSalida.Checked = false;
            }
        }


        #region EventosdelLector

        protected virtual void Init()
        {
            Enroller = new DPFP.Processing.Enrollment();			// Create an enrollment.

            try
            {
                Capturer = new DPFP.Capture.Capture();				// Create a capture operation.

                if (null != Capturer)
                {
                    //SetPrompt("Dispositivo inicializado.");
                    Capturer.EventHandler = this;					// Subscribe for capturing events.
                }
                else
                {
                    lblNotificacion.Text = "error en la operacion de captura.";

                    //SetPrompt("No se puede iniciar la operacion de captura");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("No se puede iniciar la operacion de captura", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                logger.Error("Error"+ex);
            }
        }

        /**Este meto esta a la espera de que se lea una huella para entonces ejecutarse**/
        protected virtual void Process(DPFP.Sample Sample)
        {
            MensajeLabel = "";

            string ResultadoValida = "";
            ImagenSample = Sample;
            // Draw fingerprint sample image.
            DrawPicture(ConvertSampleToBitmap(Sample));

            //************** ENROLLMENT ************************************

            // Process the sample and create a feature set for the enrollment purpose.
            DPFP.FeatureSet features = ExtractFeatures(Sample, DPFP.Processing.DataPurpose.Enrollment);

            // Check quality of the sample and add to enroller if it's good
            if (features != null)
                try
                {
                    while (Enroller.TemplateStatus != DPFP.Processing.Enrollment.Status.Ready)
                    {
                        //MakeReport("The fingerprint feature set was created.");
                        Enroller.AddFeatures(features);		// Add feature set to template.
                    }
                }catch(Exception ex){
                    logger.Error("Error",ex);
                }
                finally
                {
                    //UpdateStatus();

                    //Check if template has been created.
                    switch (Enroller.TemplateStatus)
                    {
                        case DPFP.Processing.Enrollment.Status.Ready:	// report success and stop capturing
                            OnTemplate(Enroller.Template);
                            //SetPrompt("Click Close, and then click Fingerprint Verification.");
                            //Stop();

                            ResultadoValida = ValidaHuella();
                            if (ResultadoValida == "NO_VALIDA")
                            {
                                MessageBox.Show("Huella No Valida, verifique la posicion de su dedo", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                //MensajeLabel = "Huella no valida";
                            }
                            else
                            {
                                MensajeLabel = "Espere un momento por favor.....";
                                RegistraAsistenciaEmpleado(ResultadoValida);
                                //MessageBox.Show(ResultadoValida);
                            }
                            
                            /// lblMensaje.Text = MensajeLabel;
                            break;


                        case DPFP.Processing.Enrollment.Status.Failed:	// report failure and restart capturing
                            lblNotificacion.Text = "Soltec...";
                            Enroller.Clear();
                            Stop();
                            //UpdateStatus();
                            OnTemplate(null);
                            Start();
                            break;
                    }

                }
            //************** ENROLLMENT ************************************

        }


        protected void Start()
        {
            if (null != Capturer)
            {
                try
                {
                    Capturer.StartCapture();
                    //SetPrompt("Using the fingerprint reader, scan your fingerprint.");
                    //SetPrompt("Lector de huella listo para capturar ... ");
                }
                catch
                {
                    lblNotificacion.Text = "soltec.";
                    //SetPrompt("Can't initiate capture!");
                    //SetPrompt("No se puede iniciar la captura");
                }
            }
        }


        protected void Stop()
        {
            if (null != Capturer)
            {
                try
                {
                    Capturer.StopCapture();
                    //SetPrompt("Se ha detenido la captura.");
                }
                catch
                {
                    lblNotificacion.Text = "soltec..";
                    //SetPrompt("Can't terminate capture!");
                    //SetPrompt("No se puede detener el dispositivo.");
                }
            }
        }

        #region Form Event Handlers:

        #endregion

        #region EventHandler Members:
        
            public void OnComplete(object Capture, string ReaderSerialNumber, DPFP.Sample Sample)
        {
            //MakeReport("The fingerprint sample was captured.");
            //SetPrompt("Scan the same fingerprint again.");
            //MakeReport("La huella digital ha sido capturada.");
            //SetPrompt("Por favor escanee el mismo dedo de nuevo.");
            MensajeLabel = "";
            Process(Sample);
        }

        public void OnFingerGone(object Capture, string ReaderSerialNumber)
        {
            //MakeReport("The finger was removed from the fingerprint reader.");
            //MakeReport("El dedo se ha quitado del lector.");
        }

            public void OnFingerTouch(object Capture, string ReaderSerialNumber)
        {
            //MakeReport("The fingerprint reader was touched.");
            //MakeReport("El dedo se ha colocado sobre el Lector.");
        }

        public void OnReaderConnect(object Capture, string ReaderSerialNumber)
        {
            //MakeReport("The fingerprint reader was connected.");
            //MakeReport("El Lector ha sido conectado.");
        }

        public  void OnReaderDisconnect(object Capture, string ReaderSerialNumber)
        {
            //MakeReport("The fingerprint reader was disconnected.");
            //MakeReport("El Lector se ha desconectado.");
        }

        public void OnSampleQuality(object Capture, string ReaderSerialNumber, DPFP.Capture.CaptureFeedback CaptureFeedback)
        {
            //if (CaptureFeedback == DPFP.Capture.CaptureFeedback.Good)
            //MakeReport("The quality of the fingerprint sample is good.");
            //MakeReport("La calidad de la huella digital es buena.");
            //else
            //MakeReport("The quality of the fingerprint sample is poor.");
            //MakeReport("La calidad de la huella digital es baja.");
        }
        #endregion

        protected Bitmap ConvertSampleToBitmap(DPFP.Sample Sample)
        {
            DPFP.Capture.SampleConversion Convertor = new DPFP.Capture.SampleConversion();	// Create a sample convertor.
            Bitmap bitmap = null;												            // TODO: the size doesn't matter
            Convertor.ConvertToPicture(Sample, ref bitmap);									// TODO: return bitmap as a result
            return bitmap;
        }

        protected DPFP.FeatureSet ExtractFeatures(DPFP.Sample Sample, DPFP.Processing.DataPurpose Purpose)
        {
            DPFP.Processing.FeatureExtraction Extractor = new DPFP.Processing.FeatureExtraction();	// Create a feature extractor
            DPFP.Capture.CaptureFeedback feedback = DPFP.Capture.CaptureFeedback.None;
            DPFP.FeatureSet features = new DPFP.FeatureSet();
            Extractor.CreateFeatureSet(Sample, Purpose, ref feedback, ref features);			// TODO: return features as a result?
            if (feedback == DPFP.Capture.CaptureFeedback.Good)
                return features;
            else
                return null;
        }

        protected void SetStatus(string status)
        {
            //this.Invoke(new Function(delegate()
            //{
            //    //StatusLine.Text = status;
            //}));
        }

        protected void SetPrompt(string prompt)
        {
            //this.Invoke(new Function(delegate()
            //{
            //    //txtEstadoPrompt.Text = prompt; // Para ver el estado del dispositivo
            //}));
        }
        protected void MakeReport(string message)
        {
            //this.Invoke(new Function(delegate()
            //{
            //    // StatusText.AppendText(message + "\r\n"); // para ver los mensajes de los eventos
            //}));
        }

        private void DrawPicture(Bitmap bitmap)
        {
            //this.Invoke(new Function(delegate()
            //{                
            pictureBox1.Image = new Bitmap(bitmap, pictureBox1.Size);	// fit the image into the picture box
            //}));
        }


        private void OnTemplate(DPFP.Template template)
        {
            Template = template;
            //if (Template != null)
            //    MessageBox.Show("The fingerprint template is ready for fingerprint verification.", "Fingerprint Enrollment");
            //else
            //    MessageBox.Show("The fingerprint template is not valid. Repeat fingerprint enrollment.", "Fingerprint Enrollment");
        }



        #endregion

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }
        /*
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // Para Leer los Archivos Guardados
                string archivo = "";
                string Directorio = @"C:\SFSPOS\BIO\FPT\";
                OpenFileDialog open = new OpenFileDialog();
                DirectoryInfo di = new DirectoryInfo(@"C:\SFSPOS\BIO\FPT");
                FileInfo[] ficheros = di.GetFiles("*.fpt");
                foreach (FileInfo f in ficheros)
                {
                    archivo = Directorio + f.Name;
                    open.FileName = archivo;
                    using (FileStream fs2 = File.OpenRead(open.FileName))
                    {
                        // Crea el objeto Template para la validacion
                        DPFP.Template template = new DPFP.Template(fs2);
                        ImagenTemplate = template; // ImagenTemplate se va a usar para validar la huella temporal con la nueva huella que ingresen para validar.
                    }
                    //MessageBox.Show(archivo, "Lector", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    Verificator = new DPFP.Verification.Verification();		// Create a fingerprint template verificator

                    // Process the sample and create a feature set for the enrollment purpose.
                    DPFP.FeatureSet features = ExtractFeatures(ImagenSample, DPFP.Processing.DataPurpose.Verification);

                    // Check quality of the sample and start verification if it's good
                    if (features != null)
                    {
                        // Compare the feature set with our template
                        DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
                        Verificator.Verify(features, ImagenTemplate, ref result);

                        //lblEstatus.Text = "Estatus: OK";
                        if (result.Verified)
                        {
                            MessageBox.Show(f.Name.ToString());
                            //btnGuardar.Enabled = true;
                            //  lblEstatus.Text = "Estatus: Imagen VALIDA !!!";
                        }
                        else
                        {
                            //btnGuardar.Enabled = false;
                            //lblEstatus.Text = "Estatus: Imagen No Valida.";
                        }
                        //}
                    }
                }
            }
            catch(Exception ex) 
            {
                logger.Error("error"+ex);
            }
        }
        */

        private string ValidaHuella()
        {
            // Para Leer los Archivos Guardados
            string Mensaje = "";
            string archivo = "";
            //string Directorio = @"C:\SFSPOS\BIO\FPT\";

            string DirectorioOne = @"C:\SFSPOS\BIO\LC-FINGER\";
            string DirectorioTwo = @"C:\SFSPOS\BIO\EX-FINGER\";

            DirectoryInfo di=null;
            OpenFileDialog open = new OpenFileDialog();
            try
            {
                di = new DirectoryInfo(DirectorioOne);//primer directorio de busqueda
                
                FileInfo[] ficheros = di.GetFiles("*.fpt");

                //Primer ciclo para busqueda de huellas
                foreach (FileInfo f in ficheros)
                {
                    archivo = DirectorioOne + f.Name;
                    open.FileName = archivo;
                    using (FileStream fs2 = File.OpenRead(open.FileName))
                    {
                        // Crea el objeto Template para la validacion
                        DPFP.Template template = new DPFP.Template(fs2);
                        ImagenTemplate = template; // ImagenTemplate se va a usar para validar la huella temporal con la nueva huella que ingresen para validar.
                    }
                    //MessageBox.Show(archivo, "Lector", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    Verificator = new DPFP.Verification.Verification();		// Create a fingerprint template verificator

                    // Process the sample and create a feature set for the enrollment purpose.
                    DPFP.FeatureSet features = ExtractFeatures(ImagenSample, DPFP.Processing.DataPurpose.Verification);

                    // Check quality of the sample and start verification if it's good
                    if (features != null)
                    {

                        // Compare the feature set with our template
                        DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
                        Verificator.Verify(features, ImagenTemplate, ref result);

                        if (result.Verified)
                        {
                            //En esta linea se extrae del nombre del archivo el id del usuario

                            char[] delimit = new char[] { '-' };
                            string nameFile = f.Name;
                            foreach (string substr in nameFile.Split(delimit))
                            {
                                nameFile = substr;
                            }

                            delimit = new char[] { '.' };

                            foreach (string substr in nameFile.Split(delimit))
                            {
                                nameFile = substr;
                                break;
                            }


                            //Mensaje = f.Name.Substring(0, f.Name.Length - 4);
                            Mensaje = nameFile;
                            break;
                        }
                        else
                        {
                            Mensaje = "NO_VALIDA";
                        }
                    }
                    else
                    {
                        Mensaje = "NO_VALIDA";
                    }
                }

                //termina primer ciclo de busqueda
                
                //Inicia el segundo ciclo de busqueda

                di = new DirectoryInfo(DirectorioTwo);//segundo directorio de busqueda
                ficheros = null;
                ficheros  =di.GetFiles("*.fpt");


                if (Mensaje.Equals("NO_VALIDA"))
                {
                    foreach (FileInfo f in ficheros)
                    {
                        archivo = DirectorioTwo + f.Name;
                        open.FileName = archivo;
                        using (FileStream fs2 = File.OpenRead(open.FileName))
                        {
                            // Crea el objeto Template para la validacion
                            DPFP.Template template = new DPFP.Template(fs2);
                            ImagenTemplate = template; // ImagenTemplate se va a usar para validar la huella temporal con la nueva huella que ingresen para validar.
                        }
                        //MessageBox.Show(archivo, "Lector", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        Verificator = new DPFP.Verification.Verification();		// Create a fingerprint template verificator

                        // Process the sample and create a feature set for the enrollment purpose.
                        DPFP.FeatureSet features = ExtractFeatures(ImagenSample, DPFP.Processing.DataPurpose.Verification);

                        // Check quality of the sample and start verification if it's good
                        if (features != null)
                        {

                            // Compare the feature set with our template
                            DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
                            Verificator.Verify(features, ImagenTemplate, ref result);

                            if (result.Verified)
                            {
                                //En esta linea se extrae del nombre del archivo el id del usuario
                                char[] delimit = new char[] { '-' };
                                string nameFile = f.Name;
                                foreach (string substr in nameFile.Split(delimit))
                                {
                                    nameFile = substr;
                                }

                                delimit = new char[] { '.' };

                                foreach (string substr in nameFile.Split(delimit))
                                {
                                    nameFile = substr;
                                    break;
                                }


                                //Mensaje = f.Name.Substring(0, f.Name.Length - 4);
                                Mensaje = nameFile;
                                //Mensaje = f.Name.Substring(0, f.Name.Length - 4);
                                File.Copy(archivo, DirectorioOne+IdSucursal+"-"+f.Name);
                                //int name= 1145;

                                /*
                                for (int x = 0; x < 1000; ++x)
                                {
                                    name--;
                                    File.Copy(archivo, DirectorioTwo + name + ".fpt");
                                }*/

                                    break;
                            }
                            else
                            {
                                Mensaje = "NO_VALIDA";
                            }
                        }
                        else
                        {
                            Mensaje = "NO_VALIDA";
                        }
                    }
                }


            }
            catch (Exception ex)
            {
                Console.WriteLine("Error"+ex);
                logger.Error("Error"+ex);
            }
            return Mensaje;
       }


        private void RegistraAsistenciaEmpleado(string IdEmpleado)
        {
            if (OpcionAcceso == "HUE") // Si la Opcion de acceso es por Huella Digital
            {
                string IdEmpresa = Settings1.Default.IdEmpresa.ToString();
                string IdSucursal = Settings1.Default.IdSucursal;
                //string IdEmpleado = IdEmpleadoFPT.Substring(0, IdEmpleadoFPT.Length - 3);
                string ConsultaBD = "Select Nombre from reloj_empleados where IdEmpresa = '" + IdEmpresa + "' And IdEmpleado = '" + IdEmpleado + "' ";
                ConectaBD conBD = new ConectaBD();
                DataSet ds = new DataSet();
                ds = conBD.Consulta(ConsultaBD);
                if (ds.Tables.Count == 0)
                {
                    MessageBox.Show("Error en la consulta de empleados (T)", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    //MensajeLabel = "Error en la consulta de empleados (T)";
                    return;
                }
                if (ds.Tables["Resultado"].Rows.Count == 0)
                {
                    //MensajeLabel = "Empleado no encontrado";
                    MessageBox.Show("Empleado no encontrado", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                   // txtCapturaEmpleado.Text = "";
                    return;
                }
                else
                {
                    if (TieneIncidencia(IdEmpresa, IdSucursal, IdEmpleado) == true)
                    {
                        //MensajeLabel = "Registro no permitido, existe una incidencia registrada para este empleado.";
                        MessageBox.Show("Registro no permitido, Ya se encuentra una incidencia registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                       /// txtCapturaEmpleado.Text = "";
                        return;
                    }

                    MensajeLabel = "Espere un momento por favor.....";
                    string UsoHorario = "";
                    UsoHorario = ObtieneUsoHorario(IdEmpresa, IdSucursal);

                    string TipoRegistro = "";
                    TipoRegistro = ObtieneTipoRegistro(IdEmpresa, IdSucursal, IdEmpleado, UsoHorario);
                    if (TipoRegistro == "YA_EXISTE_SALIDA")
                    {
                        //MensajeLabel = "Registro no permitido, existe una salida registrada para este empleado.";
                        MessageBox.Show("Registro no permitido, existe una salida registrada para este empleado.", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        // txtCapturaEmpleado.Text = "";
                        return;
                    }

                    bool Correcto = false;
                    string sentencia = "";
                    sentencia = "insert into reloj_registro (IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro,Fechanow) "
                   + " values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleado + "','" + TipoRegistro + "', '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', "
                   + " date(date_add(now(),interval - " + UsoHorario + " hour)), date_add(now(),interval - " + UsoHorario + " hour) )";
                    //sentencia = "insert into reloj_registro (IdEmpresa,IdSucursal,IdEmpleado,TipoRegistro,FechaHoraPC,FechaRegistro) values (" + IdEmpresa + ",'" + IdSucursal + "', '" + IdEmpleado + "','" + TipoRegistro + "', '" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "', '" + System.DateTime.Now.ToString("yyyyMMdd") + "')";
                    Correcto = conBD.InsertUpdate(sentencia);
                    if (Correcto == true)
                    {
                        string NombreEmpleado = ds.Tables["Resultado"].Rows[0]["Nombre"].ToString();
                        //txtCapturaEmpleado.Text = "";
                        string MensajeRegistro = "";
                        switch (TipoRegistro)
                        {
                            case "ENTRADA":
                                MensajeRegistro = "Entrada Registrada: " + NombreEmpleado;
                                break;
                            case "PRESENCIA":
                                MensajeRegistro = "Presencia Registrada: " + NombreEmpleado;
                                break;
                            case "SALIDA":
                                MensajeRegistro = "Salida Registrada: " + NombreEmpleado;
                                break;
                            default:
                                MensajeRegistro = "Registro Actualizado";
                                break;
                        }
                        MensajeLabel = "";
                        MessageBox.Show(MensajeRegistro, "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        chkSalida.Checked = false;
                        //chkSalida.Update();
                    }
                    else
                    {
                        //MensajeLabel = "Error al actualizar el registro, intente de nuevo.";
                        MessageBox.Show("Error al actualizar el registro", "Reloj Checador", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        //txtCapturaEmpleado.Text = "";
                    }
                }
            }        
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Stop();
            this.Close();
            this.Dispose();
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            if (OpcionAcceso == "HUE")
            {
                lblMensaje.Text = MensajeLabel;
            }

        }

        private string ObtieneUsoHorario(string IdEmpresa, string IdSucursal)
        {
            string ConsultaBD = "Select UsoHorario from catsucursales where Id_enweb = " + IdEmpresa + " and id_sucursal = '" + IdSucursal + "' ";
            ConectaBD conBD = new ConectaBD();
            DataSet ds = new DataSet();
            ds = conBD.Consulta(ConsultaBD);
            if (ds.Tables.Count == 0)
            {
                MensajeLabel = "Error en la consulta de Uso Horario (T)";
                return "0";
            }
            else
            {
                if (ds.Tables["Resultado"].Rows.Count > 0)
                {
                    return ds.Tables["Resultado"].Rows[0]["UsoHorario"].ToString(); ;
                }
                else
                {
                    return "0";
                }
            }
        }

        private void lblFecha_Click(object sender, EventArgs e)
        {

        }

        private void RelojChecador_Deactivate(object sender, EventArgs e)
        {
            //this.TopMost = true;
            //this.Enabled = false;
            lblenabled.Text = "No disponible para el registro de asistencia...";
            this.BackColor = Color.Thistle;

            //MessageBox.Show("Has salido de la venta del reloj checador", "Reloj inactivo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void RelojChecador_Activated(object sender, EventArgs e)
        {
            //this.Enabled = true;
            lblenabled.Text = "Reloj Disponible ";
            this.BackColor = Color.White;

        }


        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            lblMensaje.Text = MensajeLabel;
           
        }

    }
}